{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-13T04:37:51.019563Z",
     "iopub.status.busy": "2025-09-13T04:37:51.019437Z",
     "iopub.status.idle": "2025-09-13T04:37:52.815583Z",
     "shell.execute_reply": "2025-09-13T04:37:52.815100Z",
     "shell.execute_reply.started": "2025-09-13T04:37:51.019550Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>content</th>\n",
       "      <th>type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...</td>\n",
       "      <td>体育</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                             content type\n",
       "0  马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...   体育\n",
       "1  商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...   体育\n",
       "2  冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...   体育\n",
       "3  辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...   体育\n",
       "4  揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...   体育"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "data = pd.read_excel('./data/data.xlsx')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分词处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-13T04:37:52.816399Z",
     "iopub.status.busy": "2025-09-13T04:37:52.816209Z",
     "iopub.status.idle": "2025-09-13T04:37:57.150667Z",
     "shell.execute_reply": "2025-09-13T04:37:57.150180Z",
     "shell.execute_reply.started": "2025-09-13T04:37:52.816385Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache /tmp/jieba.cache\n",
      "Loading model cost 0.703 seconds.\n",
      "Prefix dict has been built successfully.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>content</th>\n",
       "      <th>type</th>\n",
       "      <th>content_cutted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...</td>\n",
       "      <td>体育</td>\n",
       "      <td>意外 受伤 国奥 警惕 无奈 大雨 格外 青睐 殷家 沈阳 报道 来到 沈阳 国奥 国奥队 ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...</td>\n",
       "      <td>体育</td>\n",
       "      <td>商瑞华 首战 复仇 心切 中国 玫瑰 要用 美国 方式 攻克 瑞典 瑞典 商瑞华 首战 信心...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...</td>\n",
       "      <td>体育</td>\n",
       "      <td>冠军 球队 迎新 新欢 欢乐 派对 大奖 体育 体育讯 冠军 高尔夫 高尔夫球 球队 迎新 ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...</td>\n",
       "      <td>体育</td>\n",
       "      <td>签约 危机 注册 难关 高层 威逼 威逼利诱 利诱 合同 笑里藏刀 藏刀 体育 体育讯 爆发...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...</td>\n",
       "      <td>体育</td>\n",
       "      <td>揭秘 谢亚龙 亚龙 带走 总局 电话 骗局 复制 轨迹 体坛 体坛周报 周报 特约 特约记者...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                             content type  \\\n",
       "0  马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军\\n　　记者傅亚雨沈阳报道 来到沈阳，国奥队...   体育   \n",
       "1  商瑞华首战复仇心切 中国玫瑰要用美国方式攻克瑞典\\n　　多曼来了，瑞典来了，商瑞华首战求3分...   体育   \n",
       "2  冠军球队迎新欢乐派对 黄旭获大奖张军赢下PK赛\\n　　新浪体育讯　12月27日晚，“冠军高尔...   体育   \n",
       "3  辽足签约危机引注册难关 高层威逼利诱合同笑里藏刀\\n　　新浪体育讯　2月24日，辽足爆发了集...   体育   \n",
       "4  揭秘谢亚龙被带走：总局电话骗局 复制南杨轨迹\\n　　体坛周报特约记者张锐北京报道  谢亚龙已...   体育   \n",
       "\n",
       "                                      content_cutted  \n",
       "0  意外 受伤 国奥 警惕 无奈 大雨 格外 青睐 殷家 沈阳 报道 来到 沈阳 国奥 国奥队 ...  \n",
       "1  商瑞华 首战 复仇 心切 中国 玫瑰 要用 美国 方式 攻克 瑞典 瑞典 商瑞华 首战 信心...  \n",
       "2  冠军 球队 迎新 新欢 欢乐 派对 大奖 体育 体育讯 冠军 高尔夫 高尔夫球 球队 迎新 ...  \n",
       "3  签约 危机 注册 难关 高层 威逼 威逼利诱 利诱 合同 笑里藏刀 藏刀 体育 体育讯 爆发...  \n",
       "4  揭秘 谢亚龙 亚龙 带走 总局 电话 骗局 复制 轨迹 体坛 体坛周报 周报 特约 特约记者...  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import re\n",
    "import jieba\n",
    " \n",
    "def chinese_word_cut(mytext):\n",
    "    # jieba.load_userdict('dic.txt')  # 这里你可以添加jieba库识别不了的网络新词，避免将一些新词拆开\n",
    "    jieba.initialize()\n",
    "    # 文本预处理 ：去除一些无用的字符只提取出中文出来\n",
    "    new_data = re.findall('[\\u4e00-\\u9fa5]+', mytext, re.S)\n",
    "    new_data = \" \".join(new_data)\n",
    " \n",
    "    # 文本分词\n",
    "    seg_list_exact = jieba.cut(new_data, cut_all=True)\n",
    "    result_list = []\n",
    "    with open('Stop Word Dictionary.txt', encoding='utf-8') as f: # 可根据需要打开停用词库，然后加上不想显示的词语\n",
    "        con = f.readlines()\n",
    "        stop_words = set()\n",
    "        for i in con:\n",
    "            i = i.replace(\"\\n\", \"\")   # 去掉读取每一行数据的\\n\n",
    "            stop_words.add(i)\n",
    " \n",
    "    for word in seg_list_exact:\n",
    "        if word not in stop_words and len(word) > 1:\n",
    "            result_list.append(word)      \n",
    "    return \" \".join(result_list)\n",
    "data[\"content_cutted\"] = data.content.apply(chinese_word_cut)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 代码向量化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:37:57.151296Z",
     "iopub.status.busy": "2025-09-13T04:37:57.151146Z",
     "iopub.status.idle": "2025-09-13T04:37:59.148179Z",
     "shell.execute_reply": "2025-09-13T04:37:59.147710Z",
     "shell.execute_reply.started": "2025-09-13T04:37:57.151283Z"
    },
    "tags": []
   },
   "outputs": [],
   "source": [
    "# 这里的词频矩阵可以看做是向量化，但是不体现语义含义\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "\n",
    "tf_vectorizer = CountVectorizer(strip_accents = 'unicode',\n",
    "                                max_features=500,  #提取500个特征词语\n",
    "                                stop_words='english',\n",
    "                                max_df = 0.5,  # 过滤在50%以上文档中出现的词（通用词）\n",
    "                                min_df = 5  # 保留至少在5个文档中出现的词（过滤极低频噪声）\n",
    ")\n",
    "tf = tf_vectorizer.fit_transform(data.content_cutted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建LDA模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-09-13T04:37:59.148920Z",
     "iopub.status.busy": "2025-09-13T04:37:59.148681Z",
     "iopub.status.idle": "2025-09-13T04:38:05.086742Z",
     "shell.execute_reply": "2025-09-13T04:38:05.086294Z",
     "shell.execute_reply.started": "2025-09-13T04:37:59.148904Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    font-family: monospace;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td.value pre {\n",
       "    color:rgb(255, 94, 0) !important;\n",
       "    background-color: transparent !important;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url();\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LatentDirichletAllocation(doc_topic_prior=0.1, learning_offset=50, max_iter=50,\n",
       "                          n_components=8, random_state=666,\n",
       "                          topic_word_prior=0.01)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LatentDirichletAllocation</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html\">?<span>Documentation for LatentDirichletAllocation</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_components',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_components&nbsp;</td>\n",
       "            <td class=\"value\">8</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('doc_topic_prior',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">doc_topic_prior&nbsp;</td>\n",
       "            <td class=\"value\">0.1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('topic_word_prior',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">topic_word_prior&nbsp;</td>\n",
       "            <td class=\"value\">0.01</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('learning_method',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">learning_method&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;batch&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('learning_decay',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">learning_decay&nbsp;</td>\n",
       "            <td class=\"value\">0.7</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('learning_offset',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">learning_offset&nbsp;</td>\n",
       "            <td class=\"value\">50</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_iter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_iter&nbsp;</td>\n",
       "            <td class=\"value\">50</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('batch_size',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">batch_size&nbsp;</td>\n",
       "            <td class=\"value\">128</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('evaluate_every',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">evaluate_every&nbsp;</td>\n",
       "            <td class=\"value\">-1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('total_samples',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">total_samples&nbsp;</td>\n",
       "            <td class=\"value\">1000000.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('perp_tol',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">perp_tol&nbsp;</td>\n",
       "            <td class=\"value\">0.1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('mean_change_tol',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">mean_change_tol&nbsp;</td>\n",
       "            <td class=\"value\">0.001</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_doc_update_iter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_doc_update_iter&nbsp;</td>\n",
       "            <td class=\"value\">100</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_jobs',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_jobs&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('verbose',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">verbose&nbsp;</td>\n",
       "            <td class=\"value\">0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">random_state&nbsp;</td>\n",
       "            <td class=\"value\">666</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "</script></body>"
      ],
      "text/plain": [
       "LatentDirichletAllocation(doc_topic_prior=0.1, learning_offset=50, max_iter=50,\n",
       "                          n_components=8, random_state=666,\n",
       "                          topic_word_prior=0.01)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# LDA的输入是词频矩阵，LDA 会根据这些词频信息，推断出文档 - 主题分布以及主题 - 词分布\n",
    "from sklearn.decomposition import LatentDirichletAllocation\n",
    "n_topics = 8  # 这里是设置LDA分类的主题个数，因为这里我们已经知道了每个内容的标签共有8个类型\n",
    "lda = LatentDirichletAllocation(n_components=n_topics, \n",
    "                                max_iter=50,# 迭代次数\n",
    "                                learning_method='batch',\n",
    "                                learning_offset=50,\n",
    "                                doc_topic_prior=0.1,# 文档 - 主题分布的先验参数\n",
    "                                topic_word_prior=0.01,# 主题 - 词分布的先验参数\n",
    "                               random_state=666)  \n",
    "lda.fit(tf)\n",
    "# 如果需要调参，可以使用GridSearchCV来搜索最优参数，搜索的参数有：n_topics, doc_topic_prior, topic_word_prior，评估指标可以使用perplexity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:38:05.087761Z",
     "iopub.status.busy": "2025-09-13T04:38:05.087604Z",
     "iopub.status.idle": "2025-09-13T04:38:05.092107Z",
     "shell.execute_reply": "2025-09-13T04:38:05.091704Z",
     "shell.execute_reply.started": "2025-09-13T04:38:05.087745Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Topic #0:\n",
      "经济 投资 市场 企业 政府 政策 银行 金融 美元 服务 美国 发展 计划 资金 行业\n",
      "Topic #1:\n",
      "学生 留学 申请 签证 大学 学校 教育 美国 移民 专业 心理 出国 学习 英国 选择\n",
      "Topic #2:\n",
      "电影 主持 主持人 导演 香港 票房 影片 观众 演员 很多 最佳 作品 上映 一部 拍摄\n",
      "Topic #3:\n",
      "比赛 赛季 主队 赔率 球队 主场 火箭 防守 表现 客场 球员 进攻 时间 数据 对手\n",
      "Topic #4:\n",
      "美国 中国 研究 时间 发现 科学 工作 世界 学家 日本 一种 国人 很多 人员 流感\n",
      "Topic #5:\n",
      "游戏 比赛 电子 中国 选手 竞技 决赛 电子竞技 玩家 争霸 网站 项目 手机 冠军 网络\n",
      "Topic #6:\n",
      "北京 项目 建筑 地产 城市 设计 发展 中国 生活 开发 艺术 很多 户型 活动 区域\n",
      "Topic #7:\n",
      "专家 匿名 老师 网友 谢谢 压力 支撑 持有 短期 走势 请问 分析 王老师 黄金 您好\n"
     ]
    }
   ],
   "source": [
    "# 提取并展示每个主题的关键代表性词语\n",
    "def print_top_words(model, feature_names, n_top_words):\n",
    "    tword = []\n",
    "    for topic_idx, topic in enumerate(model.components_):\n",
    "        print(f\"Topic #{topic_idx}:\")\n",
    "        # 使用get_feature_names_out获取特征名称，其返回的是一个numpy数组，这里进行适当处理来提取具体名称\n",
    "        feature_names_array = feature_names.flatten() if hasattr(feature_names, 'flatten') else feature_names\n",
    "        topic_w = \" \".join([feature_names_array[i] for i in topic.argsort()[:-n_top_words - 1:-1]])\n",
    "        tword.append(topic_w)\n",
    "        print(topic_w)\n",
    "    return tword\n",
    "\n",
    "# 输出每个主题对应词语\n",
    "n_top_words = 15\n",
    "# 将获取特征名称的方法改为使用get_feature_names_out，LDA新版更改了方法\n",
    "tf_feature_names = tf_vectorizer.get_feature_names_out()\n",
    "topic_word = print_top_words(lda, tf_feature_names, n_top_words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecutionIndicator": {
     "show": false
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:38:05.092618Z",
     "iopub.status.busy": "2025-09-13T04:38:05.092468Z",
     "iopub.status.idle": "2025-09-13T04:38:05.639594Z",
     "shell.execute_reply": "2025-09-13T04:38:05.639102Z",
     "shell.execute_reply.started": "2025-09-13T04:38:05.092606Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.00179231 0.0017924  0.0017925  0.43914031 0.55010537 0.00179242\n",
      " 0.00179249 0.0017922 ]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "topics=lda.transform(tf)\n",
    "print(topics[0]) # 查看第一篇文章的主题概率,反应第一篇文章在不同主题下的可能性大小\n",
    "topic = []\n",
    "for t in topics:\n",
    "    topic.append(list(t).index(np.max(t)))\n",
    "data['topic']=topic\n",
    "data.to_excel(\"./temp/data_topic.xlsx\",index=False)  # 将结果保存为Excel文件"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 困惑度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:38:05.640197Z",
     "iopub.status.busy": "2025-09-13T04:38:05.640057Z",
     "iopub.status.idle": "2025-09-13T04:39:23.528719Z",
     "shell.execute_reply": "2025-09-13T04:39:23.528219Z",
     "shell.execute_reply.started": "2025-09-13T04:38:05.640185Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练进度：[██████████████████████████████] 100.0% （主题数：8/8）\n"
     ]
    },
    {
     "data": {
      "image/png": "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ANx333347bff8OOPP2Lfvn34/fffERwc7J5369atGDJkCAoKCnDttdeiVatWOHr0KD777DP8/PPP2Lx5M5o3b15p+2qSRqPBM888g9WrV+Orr77CE0884fH48uXLcerUKfzf//0f9Ho9Ro0ahenTp+Obb77xuvOtMrfeeiv27duHf/3rX7Barfjss89w7bXXYuPGjRg/fjzsdjtuvvlmj6wfOXLE48yWX3/9FUOGDIHdbsdNN92Epk2bYvPmzXj99dexZMkSbNmyBTExMe75V61ahaFDh0Kj0eDWW29FUlISVq1ahd69e5f5TgKlRdgdd9yBL774Aq1atcLIkSOh1+uxYsUKjBs3Dn/88QdefvnlKvcdKN0Z9dprr2HNmjW49NJLAZRelrR+/XoAcP+Qd3H97SrevOnfvz+OHj2Kjz76CP369fPIaEREhMe8stuZisyePRvTpk1DfHw87r33XgQFBeGrr77Cn3/+KfV8V/su/H5FRESgS5cu5T7m8vbbb2PixImIiIjAddddh7i4OOzYsQPPP/881qxZgzVr1pQ5Qr5p0ybMmTMHAwYMwPjx43H8+HEAF7+sZbanVVku5Vm0aBGWLl2K6667Dr169cL69evx8ccf459//sGvv/4q9RoVsdvtuOqqq1BUVIRbb70VaWlp+PrrrzFo0CBs2rQJQ4YMQWJiIu68804cOnQIixcvxrBhw/Dnn39Cq9V6vFZVtlc2mw1XX3011q5d6x5fori4GEuXLsX111+PN954Aw888ECZ9k6aNAlbtmzBsGHD3MseAMaMGYOvv/4anTp1wtixY2EwGHDixAmsWbMG27dvR+fOnSv9LPxhm/Lggw/ijTfeQIMGDTBu3DgAwHfffYexY8fit99+w+uvv17mtbds2YK5c+fi6quvxqRJk7B//3788MMP2LBhA7Zs2SK1TZk8eTLmzZuHqKgoDB8+HHFxcThx4gRWrlyJ7t27o0OHDhBCYMiQIdi6dSt69+6Nq6++GhqNBseOHcOiRYswatQor789KUAIogDSv39/AUCsXLmySs8bM2aMACCaNWsmUlJS3NMzMjJERESECAsLEzabzT39zJkzIisrq8zrrF69Wmg0GnHPPfd4TJ8+fboAIMLDw8WBAwfc0wsLC0Xr1q2FRqMRp06dck9fuXKlACC6dOkiCgoK3NNTUlJEfHy8ACDG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8eU2xeX9998Xl112mQgJCREhISHisssu83qrv/NzsGHDBtGvXz9hMpmE2WwWI0aM8Lgtp0ybv/vuOzFgwAARHh7u/s06atQo8fvvvwshhDhx4oR46qmnRM+ePUVcXJzQ6/WicePG4oYbbpC6fSX5N0UIL6NhEJHPLFiwAPfee6/7SINazZgxAzNnzsSaNWu83r6jLiiKgn79+nm9vksNTp8+jcaNGyM5Odnr6dZERETk3dq1azFgwABMnz69WpcsEgG8ppvIZ1JTU8uMAHvq1Ck899xz0Gq1uPbaa33UMlKL1157DSUlJareeUNERETk73hNN5GPvPDCC1i6dCmuuOIKxMXF4fjx41iyZAny8vIwY8YMNGrUyNdNpACUm5uLt99+G8eOHcOCBQvQvn173HLLLb5uFhEREVG9xaKbyEeuvvpq/PHHH1i6dClycnIQHByMTp064f/+7/8wcuRIXzePAlROTg6efvppBAcHo0+fPnjnnXfct9QhIiIiorrHa7qJiIiIiIiIagmv6SYiIiIiIiKqJSy6iYiIiIiIiGoJr+n2wul0IiUlBWFhYVAUxdfNISIiIiIiIj8jhEBeXh6SkpKg0ZR/PJtFtxcpKSkcOZqIiIiIiIgqdeLECTRs2LDcx1l0exEWFgag9MMzm80+bo13QgjY7Xbo9XoejadyMSckgzkhGcwJyWBOSAZzQjICIScWiwWNGjVy14/lYdHthWuhms1mvy26nU4n0tPTERYWVuGpDFS/MSckgzkhGcwJyWBOSAZzQjICKSeV7RTw79YTERERERERBTAW3URERERERES1hEV3ANPpeHUAVY45IRnMCclgTkgGc0IymBOSoZacKEII4etG+BuLxYLw8HDk5ub67TXdRERERERE5DuydSOPdAcoIQQKCwvBfSZUEeaEZDAnJIM5IRnMCclgTkiGmnLCojtACSFgsVhUEUKqPcwJyWBOSAZzQjKYE5LBnJAMNeWERTcRERERERFRLWHRTURERERERFRLWHQHKEVRoNfrK70RO9VvzAnJYE5IBnNCMpgTksGckAw15YSjl3vB0cuJiIiIiIioIhy9XOWEEMjLy1PFwAJUe5gTksGckAzmhGQwJySDOSEZasoJi+4AJYRAQUGBKkJItYc5IRnMCclgTkgGc0IymBOSoaacsOgmIiIiIiIiqiUsuomIiIiI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xUW3bt0wfPhwLFu2LGxfaWkp/v3vf+Paa6+NeKznnnsu7Pazzz4LAKG/TTQ33ngjtm3bhpUrV0bsaz3ToKamJmy7wWDAwIEDIcsyfD5f+wdHREQEznQTERGdk3vuuQeLFi3CPffcg1GjRmHDhg3Yu3dvzJ4vIyMDl112Ge68805UVlbimWeewQUXXICf/OQnAACNRoNXXnkFxcXFGDRoEO688050794dx48fxyeffAKr1Yr33nvvrJ77N7/5DV5//XUUFxdj9uzZyMjIwLJly3Dw4EG888470GjO/Lt8k8mEgQMH4s0330Tfvn2RkZGBwYMHY/DgwXjqqadQXFyM0aNH4+677w4tGZaamhq2lnergwcPYvLkyfjhD3+ITZs24dVXX8X06dMxbNiwdp//V7/6FVasWIFp06bhrrvuwsiRI3HixAmsXr0aL774IoYNG4arr74aubm5GDt2LHJycrBr1y785S9/waRJk8Ka2hEREUXDopuIiOgczJs3D1VVVVixYgXeeustFBcXY82aNbDZbDF5vkcffRTfffcdFi5cCJfLhQkTJuD5558PzRgDwJVXXolNmzbhf//3f/GXv/wFbrcbubm5uOSSS/Czn/3srJ87JycHGzduxNy5c/Hss8/C4/Fg6NCheO+99zBp0qSzftxXXnkF999/P+bMmYOmpibMnz8fgwcPxlVXXYUPP/wQ8+fPx7x586DX6zFu3DgsXrw4avO3N998E/PmzcNvfvMb6HQ63HfffXjqqac6fG6LxYLPPvsM8+fPx8qVK7Fs2TLYbDZMmDAB+fn5AICf/exneO211/DHP/4Rbrcb+fn5mD17Nn7729+e9TETEVHXIcln06WFiIiISCEee+wxLFiwAFVVVRFd4ImIiOKN13QTERERERERxQiLbiIiIiIiIqIYYdFNREREREREFCO8ppuIiIiIiIgoRjjTTURERERERBQjLLqJiIiIiIiIYoRFNxEREREREVGMsOgmIiIiIiIiihEW3UREREREREQxwqKbiIiIiIiIKEZYdBMRERERERHFCItuIiIiIiIiohhh0U1EREREREQUI/8fDkWjPsQBH8QAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import LatentDirichletAllocation\n",
    "\n",
    "# 存储困惑度和得分的列表\n",
    "plexs = []\n",
    "scores = []\n",
    "n_max_topics = 8  # 最大主题数\n",
    "bar_length = 30  # 进度条长度\n",
    "\n",
    "# 遍历\n",
    "for i in range(1, n_max_topics + 1):\n",
    "    # 计算进度百分比（总进度基于20个主题）\n",
    "    progress = i / n_max_topics\n",
    "    completed = int(progress * bar_length)\n",
    "    progress_bar = '[' + '█' * completed + ' ' * (bar_length - completed) + ']'\n",
    "    percentage = f\"{progress * 100:.1f}%\"\n",
    "    \n",
    "    # 显示进度条（明确标注总主题数为20）\n",
    "    print(f'训练进度：{progress_bar} {percentage} （主题数：{i}/{n_max_topics}）', \n",
    "          end='\\r', flush=True)\n",
    "    \n",
    "    # 训练对应主题数的LDA模型\n",
    "    lda = LatentDirichletAllocation(\n",
    "        n_components=i,  # 主题数从1到20\n",
    "        max_iter=100,\n",
    "        learning_method='batch',\n",
    "        learning_offset=50,\n",
    "        random_state=666\n",
    "    )\n",
    "    lda.fit(tf)  # 假设tf是已准备好的文档-词矩阵\n",
    "    plexs.append(lda.perplexity(tf))  # 存储当前主题数的困惑度\n",
    "    scores.append(lda.score(tf))  # 存储当前主题数的似然得分\n",
    "\n",
    "# 训练结束后换行，避免覆盖后续输出\n",
    "print()\n",
    "\n",
    "# 可视化困惑度曲线（可按需调整展示的主题数范围）\n",
    "n_t = 8  # 示例：展示主题的结果（如需展示更多可增大此值，最大为n_max_topics）\n",
    "\n",
    "x = list(range(1, n_t))  # x轴：主题数1到n_t-1\n",
    "plt.figure(figsize=(10, 6))\n",
    "# 绘制困惑度曲线（plexs[:n_t-1]对应主题1到n_t-1）\n",
    "plt.plot(x, plexs[:n_t-1], marker='o', color='#3498db', linewidth=2, markersize=6)\n",
    "plt.xlabel(\"number of topics\", fontsize=12)\n",
    "plt.ylabel(\"perplexity\", fontsize=12)\n",
    "plt.title(\"Changes in perplexity of the LDA model with different numbers of topics\", fontsize=14)\n",
    "plt.xticks(x)  # 显示所有主题数刻度\n",
    "plt.grid(alpha=0.3, linestyle='--')  # 网格线增强可读性\n",
    "plt.tight_layout()  # 自动调整布局\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LDA模型可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecutionIndicator": {
     "show": true
    },
    "execution": {
     "iopub.execute_input": "2025-09-13T04:39:23.529456Z",
     "iopub.status.busy": "2025-09-13T04:39:23.529194Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Serving to http://127.0.0.1:8889/    [Ctrl-C to exit]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "127.0.0.1 - - [13/Sep/2025 12:39:58] \"GET / HTTP/1.1\" 200 -\n"
     ]
    }
   ],
   "source": [
    "import pyLDAvis\n",
    "import pyLDAvis.lda_model\n",
    "\n",
    "pyLDAvis.enable_notebook()  # 启用 Jupyter Notebook 支持\n",
    "\n",
    "# 假设 lda 是一个训练好的 LDA 模型，tf 是文档词矩阵，tf_vectorizer 是 CountVectorizer 或 TfidfVectorizer 对象\n",
    "pic = pyLDAvis.lda_model.prepare(lda, tf, tf_vectorizer)  # 使用 lda_model.prepare 方法\n",
    "\n",
    "# 保存可视化结果为 HTML 文件\n",
    "pyLDAvis.save_html(pic, './temp/' + 'lda_pass' + str(n_topics) + '.html')\n",
    "\n",
    "# 显示可视化结果\n",
    "pyLDAvis.show(pic, local=False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (myname)",
   "language": "python",
   "name": "venv"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
